package com.ssyan.boot.controller;

import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ssyan
 * @Description 四种类型请求参数传参测试
 * @create 2021/8/17 18:55
 * @Version 1.0
 */
@RestController
public class ParameterTestController {

    //@PathVariable,@RequestHeader,@RequestParam等注解
    // 可以接收Map<String,String>格式：
    // 将请求路径中的Rest风格的值、请求头的值、请求参数的值，以k-v形式保存到map中
    //响应结果：{"pv":{"id":"3","username":"lisi"},"name":"lisi","id":3}
    // MultiValueMap<String,List<String>>：可以接收多个value的情况
    @GetMapping("/car/{id}/owner/{username}")
    public Map<String,Object> getCar(@PathVariable("id") Integer id,
                                     @PathVariable("username") String name,
                                     @PathVariable Map<String,String> pv,
                                     @RequestHeader("User-Agent")String userAgent,
                                     @RequestHeader Map<String,String> header,
                                     @RequestParam("age") Integer age,
                                     @RequestParam("inters") List<String> inters,
                                     @RequestParam MultiValueMap<String,List<String>> params,
                                     @CookieValue("Idea-ad1cf7b6")String ideacookie,
                                     @CookieValue("Idea-ad1cf7b6") Cookie cookie) {
        Map<String,Object> map = new HashMap<>();

        map.put("id",id);
        map.put("name",name);
        map.put("pv",pv);
        map.put("userAgent",userAgent);
        map.put("header",header);
        map.put("age",age);
        map.put("inters",inters);
        map.put("params",params);
        map.put("Idea",ideacookie);
        System.out.println(cookie.getName()+"===>"+cookie.getValue());
        return map;
    }

    //获取请求体的内容 @RequestBody
    @PostMapping("/save")
    public Map postMethod(@RequestBody String content) {
        Map<String,String> map = new HashMap<>();
        map.put("content", content);
        return map;
    }

    //测试矩阵变量请求:
    //1.矩阵变量语法： /cars/sell;low=34;brand=byd,audi,yd
    //2.SpringBoot默认是禁用了矩阵变量的功能
    //3.手动开启 --> 配置webMvcConfigure接口，重写configurePathMatch()方法，手动设置UrlPathHelper的矩阵相关参数
    //      底层：WebMvcAutoConfiguration 中 configurePathMatch() 中
    //          UrlPathHelper 下的 removeSemicolonContent属性（移除;号内容属性）
    //      默认：Set if ";" (semicolon) content should be stripped（） from the request URI.
    //4.矩阵变量必须有url路径变量才能被解析
    @GetMapping("/cars/{path}")
    public Map carsSell(@MatrixVariable("low") Integer low,
                        @MatrixVariable("brand") List<String> brand,
                        @PathVariable("path") String path) {
        Map<String,Object> map = new HashMap<>();
        map.put("low",low);
        map.put("brand",brand);
        map.put("path",path);
        return map;
    }

    // 测试不同路径变量的同名矩阵变量：/boss/1;age=20/2;age=10
    // 需要在注解中的pathVar属性中指定路径变量名才能解析
    @GetMapping("/boss/{bossId}/{empId}")
    public Map boss(@MatrixVariable(value = "age",pathVar = "bossId") Integer bossAge,
                    @MatrixVariable(value = "age",pathVar = "empId") Integer empAge) {
        Map<String,Object> map = new HashMap<>();

        map.put("bossAge",bossAge);
        map.put("empAge",empAge);

        return map;
    }

}
